package com.edu.user.controller;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.edu.user.domain.dto.LoginFormDTO;
import com.edu.user.domain.dto.UserUpdateDTO;
import com.edu.user.domain.po.User;
import com.edu.user.domain.vo.DoctorInfoVO;
import com.edu.user.mapper.UserMapper;
import com.edu.user.service.UserService;
import com.edu.user.utils.*;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

import static com.edu.user.utils.RedisConstants.LOGIN_CODE_KEY;
import static com.edu.user.utils.RedisConstants.LOGIN_CODE_TTL;

@CrossOrigin
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
@Slf4j
public class UserController {

    private final UserService userService;
    @Resource
    private StringRedisTemplate stringRedisTemplate;
    @Autowired
    private AliOssUtil aliOssUtil;
    @Autowired
    private UserMapper userMapper;

    /**
     * 发送手机验证码
     * @param phone 手机号
     * @return Result<String>
     */
    @PostMapping("/login/code/{phone}")
    public Result<String> sendCode(@PathVariable("phone") String phone) {
        // 获取手机号
        if (StringUtils.isNotEmpty(phone)) {
            if (RegexUtils.isPhoneInvalid(phone)) {
                // 生成随机的6位验证码
                String code = ValidateCodeUtils.generateValidateCode(6).toString();
                log.info("sendCode: 发送验证码至手机号码 {}，验证码={}", phone, code);
                 //调用阿里云提供的短信服务API完成发送短信
                 SMSUtils.sendMessage("在线医疗预约系统","SMS_468430472",phone,code);
                // 需要将生成的验证码保存到Session
                // session.setAttribute(phone,code);
                // 保存验证码到redis，设置过期时间
                stringRedisTemplate.opsForValue().set(LOGIN_CODE_KEY + phone, code, LOGIN_CODE_TTL, TimeUnit.MINUTES);
                return Result.success("手机验证码短信发送成功");
            } else {
                log.warn("sendCode: 无效的手机号码格式 {}", phone);
                return Result.error("手机号格式不正确");
            }
        }
        log.warn("sendCode: 手机号码为空，短信发送失败");
        return Result.error("短信发送失败");
    }

    @PostMapping(value = "/login", consumes = "application/x-www-form-urlencoded")
    public Result login( LoginFormDTO loginForm){
        log.info("login: 用户尝试登录，手机号={}", loginForm.getPhone());
        //  实现登录功能
        return userService.login(loginForm);

    }

    /**
     * 查询用户信息
     * @return Result
     */
    @GetMapping("/userInfo")
    public Result select() {
        User user = ThreadLocalUtil.get();
        if (user == null) {
            log.warn("select: 未登录的用户尝试获取用户信息");
            return Result.error("请先登录");
        }
        Long userId = user.getId();
        log.info("select: 获取用户ID为 {} 的信息", userId);
        User user1 = userService.getById(userId);
        if (user1 != null) {
            log.info("select: 成功获取用户ID为 {} 的信息", userId);
            return Result.success(user1);
        }
        log.warn("select: 用户ID为 {} 的信息不存在", userId);
        return Result.error("用户不存在");
    }


    /**
     *更新用户信息
     * @param updatedUser
     * @return Result<String>
     */
    @PutMapping("/update")
    public Result<String> updateProfile(@RequestBody UserUpdateDTO updatedUser){
        User user=ThreadLocalUtil.get();
       log.info("updateProfile: 用户ID为 {} 尝试更新信息", user.getId());
        return userService.updateUserProfile(updatedUser);
    }
//    /**
//     *更新用户信息
//     * @param updatedUser
//     * @return Result<String>
//     */
//    @PutMapping("/doctor/update")
//    public Result<String> updateDoctorProfile(@RequestBody UserUpdateDTO updatedUser){
//        User user=ThreadLocalUtil.get();
//        log.info("updateProfile: 用户ID为 {} 尝试更新信息", user.getId());
//        return userService.updateUserProfile(updatedUser);
//    }


    /**
     * 文件上传
     * @param file 上传的文件
     * @return Result<String>
     */
    @PostMapping("/upload")
    public Result<String> upload(MultipartFile file) {
        log.info("upload: 尝试上传文件 {}", file.getOriginalFilename());
        try {
            User user = ThreadLocalUtil.get();
            if (user == null) {
                log.warn("upload: 未登录的用户尝试上传文件");
                return Result.error("请先登录");
            }
            // 原始文件名
            String originalFilename = file.getOriginalFilename();
            // 截取原始文件名的后缀
            String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
            // 构造新的文件名
            String objectName = UUID.randomUUID().toString() + extension;
            // 文件的请求路径
            String filePath = aliOssUtil.upload(file.getBytes(), objectName);
            user.setHeadUrl(filePath);
            userService.updateById(user);
            log.info("upload: 文件上传成功，文件路径={}", filePath);
            return Result.success(filePath);
        } catch (IOException e) {
            log.error("upload: 文件上传失败，错误信息={}", e.getMessage());
        }
        return Result.error("失败");
    }
}
